package com.demo.socket;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author gy
 * @date 2022/5/4
 */
public class SocketTCP03Server {
    public static void main(String[] args) throws IOException {
        // 思路
        // 1、在本机的 9999 端口监听，等待连接
        // 细节：要求本机没有其他服务在监听9999
        // 细节：serverSocket 可以通过 accept（）返回多个Socket【多并发：多个客户端连接我们服务器的并发】
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务器端在 9999 端口监听，等待连接");

        // 2、当没有客户端连接9999端口事，程序会阻塞，等待连接
        // 如果有客户端连接，则会返回一个Socket对象
        Socket socket = serverSocket.accept();
        System.out.println("服务器端的 socket = "+socket.getClass());

        // 3、通过socket.getInputStream（） 读取客户端写入数据通道的数据，显示
        InputStream inputStream = socket.getInputStream();

        // 4、IO读取，使用字符流，使用 InputStreamReader 将 InputStream 转换为 字符流
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();
        System.out.println(s);


        // 5、获取和socket相关的输出流对象，并发送消息
        OutputStream outputStream = socket.getOutputStream();
        // 将字节流转换为字符流
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
        // 创建 字符包装流、也叫处理流，调用相关api
        BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
        bufferedWriter.write("hello client 字符流");
        // 插入换行符，表示写入的内容结束；注意：此时要求对方使用readLine读取！！！！
        bufferedWriter.newLine();
        // 如果使用的是字符流，需要手动刷新，否则数据不会写入到数据通道
        bufferedWriter.flush();

        // 6、关闭资源 流、socket
        // 注意 直接关闭外层流 后打开的先关闭
        bufferedWriter.close();
        // 注意 直接关闭外层流
        bufferedReader.close();
        socket.close();
        serverSocket.close();
    }
}
